package com.winit.openapi.rma.validator;

import java.math.BigDecimal;
import java.math.RoundingMode;

import com.alibaba.fastjson.JSONObject;
import com.winit.oms.spi.rma.vo.RMAEnumConstant;
import com.winit.openapi.constants.ErrorCode;
import com.winit.openapi.exception.ApiException;
import com.winit.openapi.util.ValidateUtil;
import com.winit.openapi.wh.utils.PrecisionValidateUtils;
import com.winit.openapi.wh.utils.ValidateDateUtitls;
import com.winit.openapi.wh.utils.ValidateUtils;

/**
 * 校验器类
 * 
 * @version <pre>
 * Author	  Version		Date		Changes
 * dinghua.an	1.0  		2016年3月9日 	Created
 *
 * </pre>
 * @since 1.
 */
public class RmaOrderValidator {

    public static void validBaseField(JSONObject json) {
        // 退运单号
        ValidateUtil.validMaxLength(json, "returnExpressNo", 120);
        // 退货仓库
        ValidateUtil.validMaxLength(json, "warehouseCode", 30, true);
        // 退货地址
        ValidateUtil.validMaxLength(json, "returnGoodsAddr", 255, true);
        // 产品编码
        ValidateUtil.validMaxLength(json, "winitProductCode", 30, true);
        // 来源
        ValidateUtil.validMaxLength(json, "source", 10, true);
        // 是否拍照 Y:是 N：否
        ValidateUtil.validMaxLength(json, "isPhotograph", 1);

        String source = json.getString("source");
        if (RMAEnumConstant.OrderSource.ER.getType().equals(source)) {
            validCreateField(json);
        } else if (RMAEnumConstant.OrderSource.NR.getType().equals(source)) {
            validEbayField(json);
            ValidateUtil.validMaxLength(json, "claimTagNo", 60);
        } else if (RMAEnumConstant.OrderSource.OR.getType().equals(source)) {
            ValidateUtil.validMaxLength(json, "outboundOrderNo", 64, true);
            validEbayField(json);
        } else {
            throw new ApiException(ErrorCode.RMA_ORDER_SOURCE_IS_NOT_EXIST, source);
        }
    }

    /**
     * ebay 公用字段校验
     * 
     * @param json
     */
    public static void validEbayField(JSONObject json) {
        // 退货单号
        ValidateUtil.validMaxLength(json, "returnGoodsOrderNo", 64);
        // ebay卖家ID
        ValidateUtil.validMaxLength(json, "ebaySellerId", 255);
        // 买家ID
        ValidateUtil.validMaxLength(json, "ebayBuyerId", 255);
        // ebay网站地址
        ValidateUtil.validMaxLength(json, "ebaySite", 255);
        // 宝贝描述标题
        ValidateUtil.validMaxLength(json, "itemTitle", 255);
    }

    /**
     * 校验Ebay同步下单信息
     * 
     * @param json
     */
    public static void validCreateField(JSONObject json) {
        // 校验商品信息
        validMerchdiseField(json);
        // ebay 公用字段校验
        validEbayField(json);
        // ebay退货ID
        ValidateUtil.validMaxLength(json, "ebayReturnId", 255);
        // ebay退货时间
        ValidateDateUtitls.validDate(json.getString("returnDate"), "returnDate");
        // ebay 退货数量
        ValidateUtil.validMaxLength(json, "returnQuantity", 8);
        // 退货原因
        ValidateUtil.validMaxLength(json, "reason", 255);
        // 退款金额
        PrecisionValidateUtils.validateIsNumber(json.getString("refundDue"), "refundDue");
        PrecisionValidateUtils.precisionValidate(json.getBigDecimal("refundDue"), "refundDue", 2);
        PrecisionValidateUtils.precisionValidateMaxDigit(json.getBigDecimal("refundDue").setScale(2,
            BigDecimal.ROUND_HALF_UP),
            "height",
            16);
    }

    /**
     * 单步下单 第二步 商品信息校验
     * 
     * @param json
     */

    public static void validSecondField(JSONObject json) {
        // 退货单号
        ValidateUtil.validMaxLength(json, "returnGoodsOrderNo", 64, true);
        validMerchdiseField(json);
    }

    /**
     * 商品信息校验
     * 
     * @param json
     */
    public static void validMerchdiseField(JSONObject json) {
        // 商品条码
        ValidateUtil.validMaxLength(json, "merchandiseSerno", 60);
        // 商品编码
        ValidateUtil.validMaxLength(json, "merchandiseCode", 255);
        // 单品数量
        ValidateUtil.validMaxLength(json, "itemQuantity", 8, true);
        // 校验必须是数字
        ValidateUtils.isNumber(json.getString("itemQuantity"), "itemQuantity");
        // 原商品条码
        ValidateUtil.validMaxLength(json, "originalMerchandiseSerno", 60);
        // 描述
        ValidateUtil.validMaxLength(json, "remarks", 255);
    }

    /**
     * 商品信息校验
     * 
     * @param json
     */
    public static void validMerchdise(JSONObject json) {
        String ss=null;
        // 退货单号
        ValidateUtil.validMaxLength(json, "returnGoodsOrderNo", 64, true);
        ValidateUtil.validNotNull(json, "returnGoodsOrderNo");
        // 商品编码
        ValidateUtil.validMaxLength(json, "merchandiseCode", 255, true);
        ValidateUtil.validNotNull(json, "merchandiseCode");
        ValidateUtil.validNotNull(json, "originalMerchandiseSerno");
        // 中文名称
        ValidateUtil.validMaxLength(json, "nameCn", 255, true);
        ValidateUtil.validNotNull(json, "nameCn");
        // 英文名称
        ValidateUtil.validMaxLength(json, "nameEn", 255, true);
        ValidateUtil.validNotNull(json, "nameEn");
        // 描述
        ValidateUtil.validMaxLength(json, "remarks", 500);
        // 申报价值
        ValidateUtil.validMaxLength(json, "declareValue", 16, true);
        PrecisionValidateUtils.validateIsNumber(json.getString("declareValue"), "declareValue");
//        PrecisionValidateUtils.precisionValidate(json.getBigDecimal("declareValue").setScale(9,BigDecimal.ROUND_HALF_UP), 
//        		"declareValue", 9);
		if (json.containsKey("declareValue")) {
			BigDecimal declareValue = json.getBigDecimal("declareValue")
					.setScale(9, RoundingMode.HALF_UP);//erp商品数据申报价值小数位可能超出9位,截取后做校验
			PrecisionValidateUtils.precisionValidateMaxDigit(declareValue,
					"declareValue", 16);
		}
		// 仓库编码
        ValidateUtil.validMaxLength(json, "warehouseCode", 32, true);
        ValidateUtil.validNotNull(json, "warehouseCode");

    }
}
